package 力扣.双指针.双指针;

public class 爱生气的书店老板1052 {
    public static void main(String[] args) {
//        int []customers = {1,0,1,2,1,1,7,5};
//        int []grumpys = {0,1,0,1,0,1,0,1};
        int []customers = {1,2,3,4,5,6,7,8,9,9,9,10};
        int []grumpys = {0,0,0,0,0,1,1,1,0,0,0,1};
        int x = 3;
        int i = maxSatisfied(customers , grumpys, x);
        System.out.println(i);
    }

    /**
         维持一个长度为X的窗口，而且这个窗口随着在数组的遍历，总是在数组的最右边
         out: 窗口外面的顾客数量  in:窗口内部的顾客数量（因为在窗口内部，老板发功不会生气，所以不用判断老板会不会生气）
     核心：因为只要老板生气，顾客肯定不满意。所以遍历数组时，对于当前元素（当前正在遍历的数组元素），只有两种可能：0、1
          分别代表老板生气和不生气。
     */
    public static int maxSatisfied(int[] customers, int[] grumpy, int X) {
        int re = 0;//结果

        //维持一个长度为X的窗口
        for (int i = 0; i < X; i++) {
            re += customers[i];
        }
        int out = 0;//窗口外面的顾客数量
        int in = re;//窗口内部的顾客数量
        for (int i = X; i < customers.length; i++) {
            //窗口外部正常计算（需要判断老板会不会生气）
            if (grumpy[i - X] != 1){
                out += customers[i - X];
            }

            //窗口内部也正常计算（因为在窗口内部，老板发功不会生气，所以不用判断老板会不会生气）
            in -= customers[i - X];
            in += customers[i];

            if (grumpy[i] == 0){//当老板不生气时，此时顾客一定满意，顾客数量肯定增多
                re = re + customers[i];
            }else {
                re = Math.max(re, in + out);//否则，顾客最大数量等于Math.max(之前顾客的最大数量，当前窗口外顾客的数量+当前窗口内部顾客的数量)
            }
        }
        return re;
    }
}
